package demo12.javaProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * java动态代理
 * 每一个动态代理类都必须要实现InvocationHandler这个接口，
 * 表示自己的代理（能修改名字，兴趣和性别，不能修改评级）
 * */
public class OwnerInvocationHandler implements InvocationHandler {

	PersonBean person;
	 
	public OwnerInvocationHandler(PersonBean person) {
		this.person = person;
	}
 
	/*
	 *  proxy:　　指代我们所代理的那个真实对象
		method:　　指代的是我们所要调用真实对象的某个方法的Method对象
		args:　　指代的是调用真实对象某个方法时接受的参数*/
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) 
			throws IllegalAccessException {
  
		try {
			if (method.getName().startsWith("get")) {//get开头的方法都可以
				return method.invoke(person, args);
   			} else if (method.getName().equals("setHotOrNotRating")) {//指定setHotOrNotRating()修改评级的方法
				//自己不能修改评级，如果代理调用了就抛出异常
   				throw new IllegalAccessException();
			} else if (method.getName().startsWith("set")) {//set开头的方法
				return method.invoke(person, args);
			} 
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } 
		return null;
	}
}
